#include "spi.h"

SPI_HandleTypeDef hspi1;

void PY_SPI1_Init(void) {
    hspi1.Instance = SPI1;
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
    hspi1.Init.Direction = SPI_DIRECTION_2LINES;
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi1.Init.NSS = SPI_NSS_SOFT;
    hspi1.Init.Mode = SPI_MODE_MASTER;

    if (HAL_SPI_Init(&hspi1) != HAL_OK) {
        APP_ErrorHandler();
    };
}

// void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) {
//     GPIO_InitTypeDef GPIO_InitStruct = {0};
//     if (hspi1.Instance == SPI1) {
//         __HAL_RCC_GPIOB_CLK_ENABLE();
//         __HAL_RCC_GPIOA_CLK_ENABLE();
//         __HAL_RCC_SPI1_CLK_ENABLE();

//         /**SPI pin configuration
//         PB2   ------> SCK
//         PA1   ------> MISO
//         PA7   ------> MOSI
//         PA6   ------> NSS
//         */
//         /*SCK*/
//         GPIO_InitStruct.Pin = GPIO_PIN_2;
//         if (hspi->Init.CLKPolarity == SPI_POLARITY_LOW) {
//             GPIO_InitStruct.Pull = GPIO_PULLDOWN;
//         } else {
//             GPIO_InitStruct.Pull = GPIO_PULLUP;
//         }
//         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
//         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
//         GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
//         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

//         /* SPI NSS*/
//         GPIO_InitStruct.Pin = GPIO_PIN_6;
//         GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
//         GPIO_InitStruct.Pull = GPIO_PULLUP;
//         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
//         HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

//         /* MISO/MOSI*/
//         GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_7;
//         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
//         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
//         GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
//         HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

//         /*Reset SPI*/
//         __HAL_RCC_SPI1_FORCE_RESET();
//         __HAL_RCC_SPI1_RELEASE_RESET();
//     }
// }

// void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) {
//     if (spiHandle->Instance == SPI1) {
//         /* Peripheral clock disable */
//         __HAL_RCC_SPI1_CLK_DISABLE();

//         /**SPI pin configuration
//         PB2   ------> SCK
//         PA1   ------> MISO
//         PA7   ------> MOSI
//         PA6   ------> NSS
//         */
//         HAL_GPIO_DeInit(GPIOB, GPIO_PIN_2);
//         HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1 | GPIO_PIN_7 | GPIO_PIN_6);
//     }
// }


void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
  GPIO_InitTypeDef  GPIO_InitStruct;

  if (hspi->Instance == SPI1)
  {
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_SPI1_CLK_ENABLE();

    /* PA7 -> AF0 -> MOSI */
    GPIO_InitStruct.Pin       = GPIO_PIN_7;
    GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
}

void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi)
{
  if (hspi->Instance == SPI1)
  {
    __HAL_RCC_SPI1_FORCE_RESET();
    __HAL_RCC_SPI1_RELEASE_RESET();

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_7);
  }
}